局域网内IP地址冲突检测-version2

计算机网络的课程设计,编写一个程序,或利用某些程序,检测局域网内的IP地址冲突,思路如下:

自己不是IP地址的冲突者,但是有可能引起冲突,利用scapy包的arp函数,发送arp报文,获得局域网内所有IP,以及对应的Mac地址,当然,这个arp请求必须发送多次,如果只发送一次的话,那么可能只有一个相同IP的主机返回了,无法判断冲突,可以在较短时间内多次发送(不可能每次都是相同IP的同一个主机返回),如果这个时间段内,同一个IP地址对应多个Mac地址,那么存在IP地址冲突。

首先,查看自己的手机的IP地址:

可以看到,手机的IP地址是192.168.1.2
我们可以将Win7的IP地址改成上面的IP地址。

这时候,在另外一台系统为Ubuntu14.04的电脑上运行程序,就检测局域网内的IP地址冲突。

Python代码如下(arp包用的是广播发送,目的Mac地址为全F):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from scapy.all import srp,Ether,ARP,conf,get_if_hwaddr,get_if_addr
import time

ipscan='192.168.1.1/24'


import socket
import fcntl
import struct

def ip_conflict():
start = time.clock()
# print "start time", start
ip_dict = dict()
conf = False
ip_me = get_if_addr('wlan0')
mac_me = get_if_hwaddr('wlan0')
ip_dict[ip_me] = mac_me
while True:
end = time.clock()
# print "endtime",end
# print "??:"
# print int(end-start)
if int(end-start) > 1:
# print ('Timeout!!!')
break
try:
ans,unans=srp(Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=ipscan),timeout=2,verbose=False)
except Exception,e:
print str(e)
else:
print (" MAC -- IP ")
for snd,rcv in ans:
list_mac=rcv.sprintf("%Ether.src% -- %ARP.psrc%")
mac = rcv.sprintf("%Ether.src%")
ip = rcv.sprintf("%ARP.psrc%")
if ip not in ip_dict:
ip_dict[ip] = mac
else:
if mac != ip_dict[ip]:
print "**************存在ip地址冲突*************"
if ip == ip_me:
print "IP地址为:",ip
print "与本机的ip地址冲突"
print "冲突的mac地址",mac_me,ip_dict[ip]
conf = True
else:
print ""
print "IP地址为:",ip
print "冲突的mac地址为",mac,ip_dict[ip]
conf = True
print "*****************************************"
print list_mac
print "\nIP地址,MAC地址对应关系列表"
print " ip MAC"
for has_ip in ip_dict.keys():
print has_ip, "------ " + ip_dict[has_ip]
if conf is True:
print "\n当前局域网内没有IP地址冲突\n"

print "\n当前的局域网内的IP地址有:"
for has_ip in ip_dict.keys():
print has_ip
print "\n如果要修改IP地址,注意不要改为上述的IP地址,否则会有IP冲突\n"

print "欢迎使用IP地址检测程序V0.1"
print "该程序可以检测到局域网内的IP地址冲突,可以将局\n域网内的所有IP显示出来,防止修改本机IP后发生IP地址冲突\n\n"
print "开始检测:"
ip_conflict()
# print get_if_hwaddr('wlan0')
# print get_if_addr('wlan0')
# print "byebye"

在修改IP前,用Ubuntu主机检测冲突,没有IP地址冲突:

修改Win7的IP地址:

修改Win7的IP后,再用Ubuntu主机检测冲突,可以检测到IP地址冲突

再检测一次,这一次我们抓包看看,这次手机的IP地址为192.168.1.4,Win7的IP地址为192.168.1.13,修改IP地址前,我们运行程序,同时抓包查看发送的arp内容:
针对Win7:

针对iPhone:

win7的回应:

iPhone的回应:

修改Win7的IP后:

再次运行程序,可以抓取到arp报文,可以发现IP冲突:

同时,该程序也能检测到IP冲突:

如果是两台PC产生了IP冲突:
依然可以修改IP地址:
r
一台是宏碁:

一台是联想:

运行程序,可以检测到IP冲突: